package response

import (
	"encoding/json"
	"net/http"

	"github.com/gin-gonic/gin"
)

var _ Resp = (*respBody)(nil)

func Result(ctx *gin.Context, b Resp) {
	ctx.JSON(http.StatusOK, b)
}

type Resp interface {
	// i 为了避免被其他包实现
	i()
	// WithData 设置成功时返回的数据
	WithData(data interface{}) Resp
	// SetMsg 设置错误信息
	SetMsg(msg string) Resp
	// ToString 返回 JSON 格式的错误详情
	ToString() string
}

type respBody struct {
	ErrCode int         `json:"err_code"`
	Msg     string      `json:"msg"`
	Data    interface{} `json:"data"`
}

func NewResp(errCode int, msg string) Resp {
	return respBody{
		ErrCode: errCode,
		Msg:     msg,
		Data:    nil,
	}
}

func (r respBody) i() {}

func (r respBody) WithData(data interface{}) Resp {
	r.Data = data
	return r
}

func (r respBody) SetMsg(msg string) Resp {
	r.Msg = msg
	return r
}

// ToString 返回 JSON 格式的错误详情
func (r respBody) ToString() string {
	err := &struct {
		Code int         `json:"code"`
		Msg  string      `json:"msg"`
		Data interface{} `json:"data"`
	}{
		Code: r.ErrCode,
		Msg:  r.Msg,
		Data: r.Data,
	}

	raw, _ := json.Marshal(err)
	return string(raw)
}
